package httputil;

import com.gx.util.httpclientutil.HttpClientUtil;
import com.gx.util.httpclientutil.builder.HCB;
import com.gx.util.httpclientutil.common.HttpConfig;
import com.gx.util.httpclientutil.common.HttpHeader;
import com.gx.util.httpclientutil.common.SSLs;
import com.gx.util.httpclientutil.common.Utils;
import com.gx.util.httpclientutil.exception.HttpProcessException;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.apache.http.Header;
import org.apache.http.client.HttpClient;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/** 
 * 使用简单介绍
 * 
 * @author arron
 * @date 2016年11月7日 下午2:36:16 
 * @version 1.0 
 */
@Slf4j
public class Demo {
	private static final String[] urls = {
			"http://blog.csdn.net/xiaoxian8023/article/details/49883113",
			"http://blog.csdn.net/xiaoxian8023/article/details/49909359",
			"http://blog.csdn.net/xiaoxian8023/article/details/49910127",
			"http://www.baidu.com/",
			"http://126.com",
			"http://ipecho.net/plain",
			"http://ipecho.net/plain",
			"http://ipecho.net/plain",
			"http://ipecho.net/plain",
	};
	private static String [] ips =  {
			"110.73.0.3",
			"183.172.128.184",
			"171.92.34.118",
			"182.141.40.39",
			"118.117.137.3",
	};
	private static Integer[] port =  {
			8123,
			8118,
			9000,
			9000,
			9000,
	};
	public static void main(String[] args) throws HttpProcessException, FileNotFoundException {
		String url = "https://github.com/Arronlong/httpclientutil";
//		String url = "https://www.google.com.hk/webhp?hl=zh-CN&sa=X&ved=0ahUKEwiExu77sMrQAhUI9IMKHU70CbcQPAgD&gws_rd=cr,ssl";

		//最简单的使用：
		String html = HttpClientUtil.get(HttpConfig.custom().url(url));
		System.out.println(html);
		
		//---------------------------------
		//			【详细说明】
		//--------------------------------
		
		//插件式配置Header（各种header信息、自定义header）
		Header[] headers 	= HttpHeader.custom()
											.userAgent("javacl")
											.other("customer", "自定义")
											.build();
		
		//插件式配置生成HttpClient时所需参数（超时、连接池、ssl、重试）
		HCB hcb 				= HCB.custom()
											.timeout(1000) 		//超时
											.pool(100, 10)    	//启用连接池，每个路由最大创建10个链接，总连接数限制为100个
											.sslpv(SSLs.SSLProtocolVersion.TLSv1_2) 	//可设置ssl版本号，默认SSLv3，用于ssl，也可以调用sslpv("TLSv1.2")
											.ssl()  			   		//https，支持自定义ssl证书路径和密码，ssl(String keyStorePath, String keyStorepass)
											.retry(5)					//重试5次
											;
		
		HttpClient client = hcb.build();
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("key1", "value1");
		map.put("key2", "value2");
		
		//插件式配置请求参数（网址、请求参数、编码、client）
		 hcb= HCB.custom().timeout(10000).pool(100, 10).ssl();
//		ArrayList list = new ArrayList();
//		for (int i = 0; i < 100; i++) {
//			HCB finalHcb = hcb;
//			hcb.proxy("183.172.128.184",8118);
//			HCB finalHcb1 = hcb;
//			new Thread(new Runnable() {
//				@Override
//				public void run() {
//					try {
//						int idx = ((int) (Math.random() * 10)) % (urls.length-1);
////						finalHcb1.proxy(ips[idx],port[idx]);
//						list.add(idx);
////						HttpClientUtil.get(cfg.url(urls[idx]));
//						HttpConfig config = HttpConfig.custom()
//								.headers(headers)	//设置headers，不需要时则无需设置
//								.url(urls[idx])					//设置请求的url
//								.map(map)			//设置请求参数，没有则无需设置
//								.encoding("utf-8") //设置请求和返回编码，默认就是Charset.defaultCharset()
//								//.client(client)														//如果只是简单使用，无需设置，会自动获取默认的一个client对象
//								//.inenc("utf-8") 													//设置请求编码，如果请求返回一直，不需要再单独设置
//								//.inenc("utf-8")													//设置返回编码，如果请求返回一直，不需要再单独设置
//								//.json("json字符串")												//json方式请求的话，就不用设置map方法，当然二者可以共用。
//								//.context(HttpCookies.custom().getContext()) 		//设置cookie，用于完成携带cookie的操作
//								//.out(new FileOutputStream("保存地址"))			 	//下载的话，设置这个方法,否则不要设置
//								//.files(new String[]{"d:/1.txt","d:/2.txt"})					//上传的话，传递文件路径，一般还需map配置，设置服务器保存路径
//								.hcb(finalHcb);
//
//
//						//使用方式：
//						String result1 = HttpClientUtil.get(config);		//get请求
//
//						System.out.println("---idx="+idx);
//						System.out.println("---result1="+result1);
//					} catch (HttpProcessException e) {
//						log.error(e.getMessage(),e);
//					}
//				}
//			}).start();
//		}

//		 for (int i=0;i<1000000000;i++){
//
////			 String result2 = HttpClientUtil.post(config);	//post请求
//
//		 }

		//HttpClientUtil.down(config);							//下载，需要调用config.out(fileOutputStream对象)
		//HttpClientUtil.upload(config);						//上传，需要调用config.files(文件路径数组)
		
		//如果指向看是否访问正常
		//String result3 = HttpClientUtil.head(config); // 返回Http协议号+状态码
		//int statusCode = HttpClientUtil.status(config);//返回状态码
											
	}
	@Test
	public void test1() throws HttpProcessException {
		Utils.debug(false);

//		String url = "http://ntomcat.easyifer.com/huajian/V25?data={\"method\":\"userListNearby\",\"uid\":\"12\",\"args\":{\"city\":\"宁波市\",\"page\":\"1\",\"latitude\":\"29.806969\",\"longitude\":\"121.547626\"},\"token\":\"19176168\"}";
		String url = "http://ipecho.net/plain";
//		String url = "http://www.baidu.com";


//		Header[] headers 	= HttpHeader.custom()
//				.other("version", "1.0.0")
//				.other("appkey", "kdfjkdfdk")
//				.other("isdebug", "true")
//				.userAgent("Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)")
//				.other("charset","utf-8")
//				.contentType("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW")
//				.build();
//		Map<String, Object> map = new HashMap<String, Object>();
//		map.put("data", "{\"method\":\"userListNearby\",\"uid\":\"12\",\"args\":{\"city\":\"宁波市\",\"page\":\"1\",\"latitude\":\"29.806969\",\"longitude\":\"121.547626\"},\"token\":\"19176168\"}");
//		map.put(Utils.ENTITY_MULTIPART+".rmCharset", true);

		HCB hcb 				= HCB.custom()
				.timeout(1000) 		//超时
				.pool(100, 10)    	//启用连接池，每个路由最大创建10个链接，总连接数限制为100个
				.sslpv(SSLs.SSLProtocolVersion.TLSv1_2) 	//可设置ssl版本号，默认SSLv3，用于ssl，也可以调用sslpv("TLSv1.2")
				.ssl()  			   		//https，支持自定义ssl证书路径和密码，ssl(String keyStorePath, String keyStorepass)
				.retry(5)//重试5次
				.proxy("82.77.71.125",53281)
 				;

		HttpConfig config = HttpConfig.custom()
//				.headers(headers)	//设置headers，不需要时则无需设置
				.url(url)					//设置请求的url
//				.map(map)			//设置请求参数，没有则无需设置
				.encoding("utf-8") //设置请求和返回编码，默认就是Charset.defaultCharset()
//				.formdata()
				.hcb(hcb);
//		Utils.debug();


//		HttpClient client = hcb.build();
//
		String result = HttpClientUtil.post(config);	//post请求
//		String result = HttpClientUtil.post(client,url,headers,map,config.context(),"utf-8");	//post请求
		System.out.println(result);

	}

}
